module instruct_unit
(
	input wire sys_clk,
	input wire sys_rst_n,
	
	input wire exe_en,
	input wire work_ok,
	input wire [4:0] op_code_receive,
	input wire [2:0] reserve_bit_receive,
	input wire [7:0] op_rand_receive,
	
	inout wire [15:0] ctrl_bus,
	inout wire [15:0] addr_bus,
	inout wire [15:0] data_bus,

	inout wire job_ok
);

sdal sdal_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.exe_en(exe_en),
	.work_ok(work_ok),
	.op_code_receive(op_code_receive),
	.reserve_bit_receive(reserve_bit_receive),
	.op_rand_receive(op_rand_receive),
	.ctrl_bus(ctrl_bus),
	.addr_bus(addr_bus),
	.data_bus(data_bus),
	.job_ok(job_ok)
);

str str_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.exe_en(exe_en),
	.work_ok(work_ok),
	.op_code_receive(op_code_receive),
	.reserve_bit_receive(reserve_bit_receive),
	.op_rand_receive(op_rand_receive),
	.ctrl_bus(ctrl_bus),
	.addr_bus(addr_bus),
	.data_bus(data_bus),
	.job_ok(job_ok)
);

add add_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.exe_en(exe_en),
	.work_ok(work_ok),
	.op_code_receive(op_code_receive),
	.reserve_bit_receive(reserve_bit_receive),
	.op_rand_receive(op_rand_receive),
	.ctrl_bus(ctrl_bus),
	.addr_bus(addr_bus),
	.data_bus(data_bus),
	.job_ok(job_ok)
);

sub sub_inst
(
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n),
	.exe_en(exe_en),
	.work_ok(work_ok),
	.op_code_receive(op_code_receive),
	.reserve_bit_receive(reserve_bit_receive),
	.op_rand_receive(op_rand_receive),
	.ctrl_bus(ctrl_bus),
	.addr_bus(addr_bus),
	.data_bus(data_bus),
	.job_ok(job_ok)
);

endmodule

/********************************************
	本模块内容，包含了本仿真CPU的指令集。第一次
设计CPU，不打算支持太多指令。
	本次支持的指令，均是姜咏江先生的《自己动手
设计CPU与单片机》一书的3.5.1节的指令。
	在设计指令的时候，指令的含义，我这里略微有
所变化，大体上与作者的指令含义是一致的，小有差
异而已。
姜咏江先生的教材的3.5.1节的指令包括以下几种。

格式	机器指令编码	汇编指令	功能解释
1		00001			Lda r		将dram的r单元的数取出来，送到累加器da
2		00010			Add r		dram的r单元的数与累加器da相加，结果放在da中
3		00011			Out r		将dram的r单元内容送到out寄存器输出
4		00100			Sdal n		将常数n送入累加器da的低8位，并扩充成16位有符号数
5		00101			Sdah n		将常数n送入累加器da的高8位，并与低8位组成16位有符号数
6		00110			Str r		将累加器da的内容送到dram的r单元保存
7		00111			Sub r		dram的r单元与累加器da相减，结果放在累加器da
8		01000			Jmp r		跳转到iram的r单元
9		01001			Jz r		若da=0，则跳转到iram的r单元
10		01010			Jn r		若da<0，则跳转到iram的r单元
11		01011			Call r		调用子程序r，r是子程序地址
12		01100			Ret			从子程序返回
13		01101			Mult r		dram的r单元与累加器da相乘，结果放在累加器da
14		01110			Divi r		dram的r单元与累加器da相除，结果放在累加器da
15		11111			Stp			停止

以上指令，我并不打算都实现。因为我不喜欢书上的指令格式
本次，我只实现这里面的一部分就可以了。以后，我还是打算实现一个成熟一些的指令集。
目前，我比较希望实现的是8086的部分指令，或者6502的部分或全部指令。
本次，我只想意思一下。

我想要实现的指令如下所示。
格式	机器指令编码	汇编指令	功能解释
2		00010			Add r		dram的r单元的数与累加器da相加，结果放在da中
4		00100			Sdal n		将常数n送入累加器da的低8位，并扩充成16位无符号数
6		00110			Str r		将累加器da的内容送到dram的r单元保存
7		00111			Sub r		累加器da的值减去dram的r单元，结果放在累加器da
*********************************************/